package juego.personaje.mario;
 
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.ImageIcon;

import juego.graficos.ElementoGrafico;
import juego.main.SoundPlayer;
import juego.malos.Enemigo;
import juego.niveles.generator.Nivel;

/**
 * Clase que modela la caracteristica con tiros de Mario Bros, esto es
 * un Mario Bros con Tiros.
 * @author Latini Macarena
 * @author Rosas Tifany
 */
public class CaracteristicaTiros extends CaracteristicaSuper {

	protected Timer timer;
	protected int segundos;//manejar el valor del contador
	protected ElementoGrafico disparo;
	protected Enemigo enemigoadisparar;
	protected boolean controlTiro;
	
	/**
	 * Constructor
	 * @param m Mario Bros.
	 */
	public CaracteristicaTiros(Mario m) {
		super(m);
		controlTiro=false;
		cargarGraficos();
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * Metodo que le permite a Mario disparar.
	 */
	public void disparar()
	{
		if(!controlTiro)
		{
			controlTiro=true;
			Nivel nivel=mario.obtenerMain().obtenerNivel();
			Iterator<Enemigo>itEnemigos=nivel.obtenerListaEnemigos().iterator();
			Enemigo enemigo, enemigoAmatar;
			enemigoAmatar=null;
			int posX;
			int posY, posYmario;

			posYmario=mario.getGrafico().getLocation().y+32;
			boolean encontre=false;
			while(itEnemigos.hasNext() && !encontre)
			{
				enemigo=itEnemigos.next();
				if(enemigo.vive())
				{
					posY=enemigo.getGrafico().getLocation().y;
					if(posY==posYmario)
					{
						enemigoAmatar=enemigo;
						encontre=true;
					}
				}
			}
			while(itEnemigos.hasNext() &&enemigoAmatar!=null)
			{
				enemigo=itEnemigos.next();
				if(enemigo.vive())
				{
					posX=enemigo.getGrafico().getLocation().x;
					posY=enemigo.getGrafico().getLocation().y;
					if(posY==posYmario){
						int posXamatar=enemigoAmatar.getGrafico().getLocation().x;
						if(posXamatar>posX)
						{
							enemigoAmatar=enemigo;
						}
					}
				}
			}
			if(enemigoAmatar!=null)
			{
				enemigoadisparar=enemigoAmatar;
				largarDisparo(enemigoadisparar);
			}
			else
			{
				controlTiro=false;
			}
		}
		
	}
	
	/**
	 * Metodo que larga el disparo.
	 * @param e Enemigo a disparar.
	 */
	private void largarDisparo(Enemigo e)
	{
		SoundPlayer s=new SoundPlayer("/juego/musica/disparo.mp3");

		disparo=new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/entidades/disparo.gif")));
		disparo.setBounds(0, 0, 32, 32);
		mario.obtenerMain().agregarTiroAFondo(disparo);
		disparo.setLayout(null);
		int posXmario=mario.getGrafico().getLocation().x;
		int posYmario=mario.getGrafico().getLocation().y;
		disparo.setLocation(posXmario+32,posYmario+32);
		disparo.setVisible(true);
		comenzarConteo();
		s.play();


	}
	
	/**
	 * Metodo que convierte a Mario en Super Mario Bros.
	 * @param m Mario a convertir.
	 */
	public void convertirA(Mario m)
	{
		mario.setCaracteristica(new CaracteristicaSuper(mario));
		Caracteristica c=mario.obtenerCaracteristica();
		c.setGrafica();	
	}
	
	/**
	 * Metodo que convierte a Mario en Super Mario si
	 * colisiona con un enemigo.
	 */
	public void colisionConMalo(Enemigo e) {
		// TODO Auto-generated method stub
		convertirA(mario);
	}
	
	/**
	 * Setea los graficos correspondientes a esta caracteristica.
	 */
	public  void setGrafica(){
		// TODO Auto-generated method stub
		ElementoGrafico eg= new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/tirosquieto.gif")));
	
		eg.setBounds(0,0, 32, 64);
		mario.setGrafico(eg);
		int x=mario.getGrafico().getLocation().x;
		int y=mario.getGrafico().getLocation().y;
		mario.getGrafico().setBounds(x, y, 32, 64);
		mario.getGrafico().setLocation(x, y);
		controlarSalto=eg;	
	}
	
	//clase interna que sobre-escribe el metodo run de TimerTask
	class RemindTask extends TimerTask {
		public void run() {
		
			segundos++;
			int posXdisparo=disparo.getLocation().x;
			int posYdisparo=disparo.getLocation().y;
			int posXenemigo=enemigoadisparar.getGrafico().getLocation().x;
			posXdisparo+=1;
			disparo.setLocation(posXdisparo,posYdisparo);
			if(posXenemigo-posXdisparo<=16)
			{
				enemigoadisparar.colisionPorArriba(mario);
				disparo.setVisible(false);
				timer.cancel(); //detenemos el timer
				controlTiro=false;
			}
			else
			{
				if(posXdisparo>posXenemigo)
				{
					disparo.setVisible(false);
					timer.cancel(); //detenemos el timer
					controlTiro=false;
				}
			}
		}
	}
	
	public void comenzarConteo()
	{
		timer = new Timer();
		//le asignamos una tarea al timer
		timer.schedule(new RemindTask(),0, 1*5);
	}
	

	/**
	 * Carga los graficos correspondientes a la caracteristica que
	 * se esta modelando.
	 */
	public void cargarGraficos() {
		// TODO Auto-generated method stub
		ElementoGrafico e=new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/tirosderecha.gif")));
		e.setBounds(0,0, 32, 64);
		derecha.setIcon(e.getIcon());
		
		e=new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/tirosizquierda.gif")));
		e.setBounds(0,0, 32, 64);
		izquierda.setIcon(e.getIcon());

		e=new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/tirosquieto.gif")));
		e.setBounds(0,0, 32, 64);
		nada.setIcon(e.getIcon());
		
		e= new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/tirossaltoder.gif")));
		e.setBounds(0,0, 32, 64);
		saltarder.setIcon(e.getIcon());
		
		e= new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/tirossaltoizq.gif")));
		e.setBounds(0,0, 32, 64);
		saltarizq.setIcon(e.getIcon());
		
		e=new ElementoGrafico(new ImageIcon(getClass().getClassLoader().getResource("juego/graficos/mariocontiros/aga.gif")));
		e.setBounds(0,0, 32, 64);
		agachado.setIcon(e.getIcon());
	}


}
